#ifndef __MESSAGE_H__
#define __MESSAGE_H__


#include "public.h"
#include <string>
#include <sstream>


class Message{
private:
    std::string m_coloredHeader;    //带颜色，打印到终端里
    std::string m_commonHeader;     //不带颜色，打印到日志里
    std::string m_msg;              //日志消息（上面两个是日志头，这个是日志消息）

    //格式化日志头部某个字段的颜色(色号，颜色深浅，不同字段之间的分隔符，要格式化的字段，是否上色)
    //日志的头部：[时间戳][日志级别][文件名称][函数名称][行号]，一个[xx]就是一个字段
    std::string formatFieldWithColor(COLOR_NUMBER colorNumber, bool dark, 
    const std::string& delimiter, const std::string& fieldName, bool colored = true);
            //该函数就是对这一句的拼接
            //printf("\033[0;35m helloworld\n");浅色
            //printf("\033[1;35m helloworld\n");深色
        

public:
    Message(LOG_LEVEL level, const std::string& absoluteFileName,
    const std::string& functionName, int lineNumber);

    //格式化日志头部，将各个字段拼接起来
    //日志的头部：[时间戳][日志级别][文件名称][函数名称][行号]，一个[xx]就是一个字段
    std::string FormatHeader(LOG_LEVEL level, const std::string& fileName,
    const std::string& functionName, int lineNumber, bool colored = true);
        //时间戳

        //日志级别

        //文件名称

        //函数名称

        //行号

    std::string ToString(bool colored = true)const ;

    //模板函数实现输出不同格式的信息
    template <typename T>
    Message& operator<<(const T& t) {
        std::stringstream ss;
        ss << t;
        m_msg += ss.str();
        return *this;
    }
};


#endif